<?php

class WebAction extends Action{
    public function index(){//获取当前页面 应该具有什么样的模块
        //t 是type 是页面类型
        if(!isset($_GET['mid']) || !isset($_GET['pagetype']) || !isset($_GET['token'])) exit("错误");
        //$id = $_GET['id'];
        $mid = $_GET['mid'];
        //$pagetype = $_GET['t'];
        $pagetype = $_GET['pagetype'];
        $token = $_GET['token'];

        if($mid) {//这里的判断主要是验证是不是首页 因为所有网站的首页$mid = 0
            $menu = M('web_menu')->where(array('id' => $mid))->find();
            $sysmodel = $menu['sysmodel'];
        }else{
            $sysmodel = 'index';
        }
        //获取相对应的系统模型 会有哪些模块  要保证 存在的系统模型都应该有对应的模块  如果这个数据没有 这里无法生成 因为这个是系统的问题 所以要报错
        $pagemodel = M('web_relation')->where(array('sysmodel'=>$sysmodel,'pagetype'=>$pagetype))->find();
        if(!$pagemodel){
            $this->error('此页面暂时无法编辑');
        }
        //这个是本页面的模板  如果没有的话 应该有一个初始化的模板
        $template = M('web_page')->where(array('cid'=>$mid,'pagetype'=>$pagetype,'token'=>$token))->find();

        if(!$template){
            //如果没有 在数据库中新建一条
            $data = array();
            $data['token'] = $_GET['token'];
            $data['cid'] = $mid;
            $data['pagetype'] = $pagetype;
            M('web_page')->add($data);
        }


        $this->assign( 'modellist', unserialize($pagemodel['modellist']) );
        $this->parseFile(unserialize($pagemodel['modellist']));//为页面添加js css文件
        if(!$template || !$template['tempdata'] ){
            $this->assign('tempdata','[]');
        }else {
            $this->assign('tempdata', $template['tempdata']);
        }
        $this->assign('modelid',$template['modelid']);
        //$this->assign('id',$menu);
        $this->assign('mid',$mid);
        //$this->assign('t',$pagetype);
        $this->assign('pagetype',$pagetype);
        $this->assign('token',$token);

        //这两个参数用于有特殊参数的模块处理 有专门的类处理这个参数与模块的关系 在org/wjbweb文件夹下
        $this->assign('get',json_encode($_GET));
        $this->assign('post',json_encode($_POST));

        $this->display();
    }

    public function model(){
        $this->display();
    }

    /**
     * ajax
     *参数中还需要加token
     */
    public function getmodel(){
        //js代码不能放在这里 因为可能会造成重复
        //style标签也是一样
        //某些功能必须通过规则，协议的方式进行
        $model = $_GET['model'];
        $modelid = $_GET['modelid'];
        $id = $_GET['id'];
        $pagetype = $_GET['pagetype'];
        $token = $_GET['token'];

        //处理编辑页面的get和post参数
        $pageget = json_decode(htmlspecialchars_decode($_GET['pageget']),true);
        $pagepost = json_decode(htmlspecialchars_decode($_GET['pagepost']),true);

        $r = M('web_page')->where(array('cid'=>$id,'pagetype'=>$pagetype,'token'=>$token))->find();
        $fun = unserialize($r['funlist']);

        //新标签
        $signName = $model.$modelid;
        $sign = array('name'=>$model,'args'=>array());
        $fun[$signName] = $sign;

        $r['funlist'] = serialize($fun);
        M('web_page')->where(array('cid'=>$id,'pagetype'=>$pagetype,'token'=>$token))->save($r);

        //$sign['args'],$signName,$model,$token,$id
        include '/tpl/Web/resource/fun/common.php';

        if(!$sign['args']){
            $temp= M('web_model')->where(array('name'=>$model))->find();
            if($temp && $temp['args'] ) {
                $sign['args'] = unserialize($temp['args']);
            }else{
                $sign['args'] = array();
            }
            $sign['args']['token'] = $token;
            $sign['args']['menu'] = $id;
        }

        import('ORG.Wjbweb.ModelArg');
        $modeArg = new ModelArg();
        $specialArgs = $modeArg -> parseArgs($pageget,$pagepost,$model,$signName);
        $modelhtml = $model($sign['args'],$signName,$model,$specialArgs);//第一次拖动进来 参数应该都是默认的 在默认的情况下进行编辑
        $str = <<<CODE
        <div style="width:100%;border:1px dotted #006da2;" id="{$signName}" signName="{$signName}" modelName="{$model}">
            <div style="position:relative;" onmouseover="showedit(this);" onmouseout="hiddeedit(this);">
                <div class="modeledit" style="position:absolute;width:80px;height:30px;background-color:#ffaaff;left:0px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="showEditorIframe('{$model}','{$signName}');"><img src="/tpl/static/images/web/edit.png" /></div>
                <div class="modeledit" style="position:absolute;width:50px;height:30px;background-color:#ffaaff;left:80px;top:0px;border:0px solid black;display:none;z-index:9999;"><img src="/tpl/static/images/web/style.png" /></div>
                <div class="modeledit" style="position:absolute;width:60px;height:30px;background-color:#ffaaff;left:130px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="delContent(this);"><img src="/tpl/static/images/web/delete01.png" /></div>
                <div class="modeledit" style="position:absolute;width:50px;height:30px;background-color:#ffaaff;left:190px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="moveUp(this);"><img src="/tpl/static/images/web/arrowup2.png" /></div>
                <div class="modeledit" style="position:absolute;width:50px;height:30px;background-color:#ffaaff;left:240px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="moveDown(this);"><img src="/tpl/static/images/web/arrowdown2.png" /></div>
                {$modelhtml}
            </div>
        </div>
CODE;

        exit($str);
    }

    /**
     * ajax
     * 这个函数应该与上面那个函数合并起来
     */
    public function initmodel(){
        $signName = $_GET['signname'];
        $id = $_GET['id'];
        $pagetype = $_GET['pagetype'];
        $token = $_GET['token'];

        //处理编辑页面的get和post参数
        $pageget = json_decode(htmlspecialchars_decode($_GET['pageget']),true);
        $pagepost = json_decode(htmlspecialchars_decode($_GET['pagepost']),true);

        file_put_contents('b.txt',var_export($pageget,true));


        $r = M('web_page')->where(array('cid'=>$id,'pagetype'=>$pagetype,'token'=>$token))->find();
        $fun = unserialize($r['funlist']);

        $sign = $fun[$signName];
        $model = $sign['name'];

        include '/tpl/Web/resource/fun/common.php';

       //如果还没有设置参数 那么就用模块的默认参数 模块的默认参数 应该是在模块的表里  但是有的参数确实不好默认 因为要根据每个人的实际情况来的
        //比如像token这样的  还有就有的参数是确定栏目的 这样的默认参数也是很难设置  所以那些特殊的参数是不是应该在各个函数内部去自己处理呢
        if(!$sign['args']){
            $temp= M('web_model')->where(array('name'=>$model))->find();
            if($temp && $temp['args']) {
                $sign['args'] = unserialize($temp['args']);
            }else{
                $sign['args'] = array();
            }
            $sign['args']['token'] = $token;
            $sign['args']['menu'] = $id;
        }
        //传入参数  加 标签名 和模块名 token 和menu
        import('ORG.Wjbweb.ModelArg');
        $modeArg = new ModelArg();
        $specialArgs = $modeArg -> parseArgs($pageget,$pagepost,$model,$signName);
        $modelhtml = $model($sign['args'],$signName,$model,$specialArgs);//第一次拖动进来 参数应该都是默认的 在默认的情况下进行编辑

        $str = <<<CODE
        <div style="width:100%;border:1px dotted #006da2;" id="{$signName}" signName="{$signName}" modelName="{$model}" >
            <div style="position:relative;" onmouseover="showedit(this);" onmouseout="hiddeedit(this);">
                <div class="modeledit" style="position:absolute;width:80px;height:30px;background-color:#ffaaff;left:0px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="showEditorIframe('{$model}','{$signName}');"><img src="/tpl/static/images/web/edit.png" /></div>
                <div class="modeledit" style="position:absolute;width:50px;height:30px;background-color:#ffaaff;left:80px;top:0px;border:0px solid black;display:none;z-index:9999;"><img src="/tpl/static/images/web/style.png" /></div>
                <div class="modeledit" style="position:absolute;width:60px;height:30px;background-color:#ffaaff;left:130px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="delContent(this);"><img src="/tpl/static/images/web/delete01.png" /></div>
                <div class="modeledit" style="position:absolute;width:50px;height:30px;background-color:#ffaaff;left:190px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="moveUp(this);"><img src="/tpl/static/images/web/arrowup2.png" /></div>
                <div class="modeledit" style="position:absolute;width:50px;height:30px;background-color:#ffaaff;left:240px;top:0px;border:0px solid black;display:none;z-index:9999;" onclick="moveDown(this);"><img src="/tpl/static/images/web/arrowdown2.png" /></div>
                {$modelhtml}
            </div>
        </div>
CODE;
        file_put_contents('a.txt',$str);
        exit($str);

    }


    public function savecode(){
        $code = $_POST['code'];
        $id = $_GET['mid'];
        $t = $_GET['pagetype'];
        $tempdata = $_POST['tempdata'];
        $modelid = $_POST['modelid'];
        $token = $_POST['token'];

        $data = array();
        $data['template'] = htmlspecialchars_decode($code);
        $data['tempdata'] = htmlspecialchars_decode($tempdata);
        $data['modelid'] = htmlspecialchars_decode($modelid);

        //去除掉多余的标签  因为JSON数据结构 变了 所以这里也要变
        $old = M('web_page')->where(array('cid'=>$id,'pagetype'=>$t,'token'=>$token))->find();
        $tmp = json_decode($data['tempdata'],true);
        $stay = array();
        for( $i = 0; $i < count($tmp); $i++ ){//循环布局模块 table
            for($j = 1; $j < count($tmp[$i]); $j++ ){//遍历td
                //遍历td中的模块
                $o = $tmp[$i][$j];//这个数组中 奇数项为标签 偶数项为模块名 如果算下标 就是偶数项下标为标签名
                for($k = 0; $k < count($o); $k++ ){
                    if(!($k % 2)){
                        array_push($stay,$o[$k]);
                    }
                }
            }
        }


        $new = array();
        $funlist = unserialize($old['funlist']);
        foreach($funlist as $key => $val ){
            if(in_array($key,$stay)){
                $new[$key] = $val;
            }
        }

        $funlist = serialize($new);

        $data['funlist'] = $funlist;

        //exit(var_dump($data));
        $res = M('web_page')->where(array('cid'=>$id,'pagetype'=>$t,'token'=>$token))->save($data);

        if($res !== false) {
            exit("1");
        }else{
            exit("保存失败");
        }
    }

    public function showedit(){
        //针对每个模板编辑进来 都要有一个对应的处理函数去接受参数

        $model = $_GET['model'];
        $sign = $_GET['sign'];
        $id = $_GET['id'];
        $t = $_GET['t'];
        $token = $_GET['token'];

         //五大元素
        $this->assign('id',$id);
        $this->assign('t',$t);
        $this->assign('model',$model);
        $this->assign('sign',$sign);
        $this->assign('token',$token);
        //是不是这之前要调用一个函数 来解析 但是这个解析不是  就是初始化 编辑页面 先解决显示的问题 在解决编辑这边的问题
        $this->display('./tpl/Web/resource/edit/'.$model.'.html');//用全路径的时候 要带后缀名  这里一定要打.  因为跟模板中的路径不一样 模板文件是直接相对于网站根路径了，这个是php中要用的路径

    }


    public function  getconfig(){
        $id = $_POST['id'];
        $t = $_POST['pagetype'];
        $sign = $_POST['sign'];
        $model = $_POST['model'];
        $token = $_POST['token'];

        $data = $_POST['data'];
        $data = htmlspecialchars_decode($data);
        $data = json_decode($data,true);


        include '/tpl/Web/resource/edit/fun.php';
        $model = $model.'edit';
        if(function_exists($model)){
            $res = $model($id,$t,$sign,$data,$token);
        }else{
            $res = saveConfig($id,$t,$sign,$data,$token);
        }

        if($res){
            exit("1");
        }else{
            exit("0");
        }
    }


    /**
     *获取编辑界面需要的数据  或者规定编辑界面只能编辑样式  还是不一定只能编辑样式  还是可以调用后台函数吧 每个模块一个文件 这样子来管理
     * 要设置一种传递参数的方式
     * $model  是模块名  引用以模块名为名字的文件 调用文件中 模块名为名字的函数   那个函数决定调用什么函数
     * 他们之间的通信规则 由模块的编辑页面自行决定  因为这个也是独立的
     *
     * 每个模块都应该在第一次初始化的时候传递默认参数过去  这个是根据
     */
    public function geteditdata(){
        $model = $_GET['model'];
        $args = $_POST;
        $file = '/tpl/Web/resource/edit/fun/'.$model.'.php';
        $dir =   getcwd();
        $path = $dir.$file;
        if(file_exists($path)){
            include $file;
            echo  $model($args);
        }else{
            $this->geteditdataDefault($args);
        }

    }

    /**
     * 没有相应文件的时候 这个就是默认的获取默认参数的方法 比如导航栏的数据 就比较特殊一点  如果是一般模块 那么用这个方法 调用统一的数据
     */
    public function geteditdataDefault($args){

        $res = M('web_page')->where(array('token'=>$args['token'],'cid'=>$args['pageid'],'pagetype'=>$args['pagetype']))->find();

        $funlist = unserialize($res['funlist']);
        //exit(var_export($res,true));
        $sign = $funlist[$args['sign']];
        $theargs = $sign['args'];

        if($theargs) {
            $theargs = json_encode($theargs);
            exit($theargs);
        }else{
            $res = M('web_model')->where(array('name'=>$sign['name']))->find();
            if($res){
                $theargs = unserialize($res['args']);
                $theargs = json_encode($theargs);
                exit($theargs);
            }else{
                exit;
            }
        }
    }
    public function ceshi(){

    }



    //直接从IndexAction.class.php复制过来的两个方法 为模块添加引入的js 和css文件   稍微做了点改动
    /**
     * @param $modelList 模块数组
     */
    public function parseFile($modelList){

        //这里生成$modelListStr 改动了下
        $modelListStr = '';
        foreach($modelList as $key =>$val ){

            $modelListStr .= '\''.$val['name'].'\',';
        }

        if($modelListStr) {
            $modelListStr = trim($modelListStr,',');
            $res = M('web_model')->where('name in (' . $modelListStr . ')')->select();
            //去除为空的 将js和css文件都提取出来  重复的文件都去掉了 排序以最后一个出现的为准
            $fileConfig = array('js'=>array(),'css'=>array());
            foreach($res as $v){
                if($v){
                    $fileList = unserialize($v['file']);
                    if($fileList['js']){
                        foreach($fileList['js'] as $js=>$index){
                            $fileConfig['js'][$js] = $index;
                        }
                    }
                    if($fileList['css']){
                        foreach($fileList['css'] as $css => $index){
                            $fileConfig['css'][$css] = $index;
                        }
                    }
                }
            }

            //将js 文件 和css  文件 直接生成相应的网页字符串  首先要排序  排序首先要改变数组结构

            $jsArr = array();
            foreach($fileConfig['js'] as $key => $val ){
                array_push($jsArr,array($key,$val));
            }
            $cssArr = array();
            foreach($fileConfig['css'] as $key => $val ){
                array_push($cssArr,array($key,$val));
            }


            $jsArr = $this->quickSort($jsArr);
            $cssArr = $this->quickSort($cssArr);


            $jsStr = '';
            foreach( $jsArr as $val ){
                $jsStr .= '<script type="text/javascript" src="'.$val[0].'"></script>';
            }
            $cssStr = '';
            foreach( $cssArr as $val ){
                $cssStr .= '<link rel="stylesheet" type="text/css" href="'.$val[0].'" />';
            }

            //这里改成直接赋值
            $this->assign('jsStr',$jsStr);
            $this->assign('cssStr',$cssStr);


        }


    }

    /**
     * @param $arr $arr的形式是这样的  'file'=>index 得改改形式 改成  index =>array('file','fileindex')
     * @return array
     */
    public function quickSort($arr)
    {
        if (count($arr) > 1) {
            $k = $arr[0][1];
            $x = array();
            $y = array();
            $_size = count($arr);
            for ($i = 1; $i < $_size; $i++) {
                if ($arr[$i][1] <= $k) {
                    $x[] = $arr[$i];
                } elseif ($arr[$i][1] > $k) {
                    $y[] = $arr[$i];
                }
            }
            $x = $this->quickSort($x);
            $y = $this->quickSort($y);
            return array_merge($x, array(array($arr[0][0],$arr[0][1])), $y);
        } else {
            return $arr;
        }
    }


    /**
     * @param $args array 用于处理模块配置的args参数  目前只需要将字符串从htmlspecialchars 转到正常的html代码
     */
    private function processArgsForShow($args){
        foreach( $args as $key => $val ){
            if( is_string($val) ){
                $args[$key] = htmlspecialchars_decode($val);
            }
        }
        return $args;
    }

    /**
     * @param $args array  与上一个函数 一个是保存用 一个是取出用
     */
    private function processArgsForSave($args){
        foreach( $args as $key => $val ){
            if( is_string($val) ){
                $args[$key] = htmlspecialchars($val);
            }
        }
        return $args;
    }

}